﻿using Share;
using Microsoft.SemanticKernel;
using System.Text.Json;
using AdvancedPrompt;

var kernel = Kernel.CreateBuilder()
     .AddOpenAIChatCompletion(
    modelId: "gpt-3.5-turbo",
    apiKey: "sk-9gH1lRVZemdh4eStDMJllCSLLt9VTq4ls18orr",
    httpClient: new HttpClient(new OpenAIHttpClientHandler("https://api.token-ai.cn/")))
    .Build();

string info =
    @"
    张飞
    | 项目 | 信息 |
    | ---- | ---- |
    | 名字 | 张飞 |
    | 字号 | 益德 |
    | 出生日期 | 未知 |
    | 出生地 | 涿郡 |
    | 职业 | 汉末群雄、蜀汉五虎上将之一 |
    | 主要成就 | 蜀汉五虎上将之一，曾任益州牧，有勇猛之名 |
    | 逝世日期 | 221年 |
    | 主要关系 | 刘备的结义兄弟，关羽的结义兄弟 |

    刘备
    | 项目 | 信息 |
    | ---- | ---- |
    | 名字 | 刘备 |
    | 字号 | 玄德 |
    | 出生日期 | 161年 |
    | 出生地 | 涿郡 |
    | 职业 | 汉朝皇帝，蜀汉政权创立者 |
    | 主要成就 | 三国时期蜀汉的建立者和首任皇帝，有仁德之名 |
    | 逝世日期 | 223年 |
    | 主要关系 | 张飞和关羽的结义兄弟 |

    关羽
    | 项目 | 信息 |
    | ---- | ---- |
    | 名字 | 关羽 |
    | 字号 | 云长 |
    | 出生日期 | 未知 |
    | 出生地 | 河东解县 |
    | 职业 | 汉末群雄、蜀汉五虎上将之一 |
    | 主要成就 | 蜀汉五虎上将之一，曾任荆州牧，有忠义之名 |
    | 逝世日期 | 219年 |
    | 主要关系 | 刘备的结义兄弟，张飞的结义兄弟 |
    ";

var promptTemplate =
    @"
    ## 用户信息：
    {{$input}}

    ## 要求：
    - 您需要帮我将用户的名字，字号，出生日期，出生地，职业，主要成就，逝世日期，主要关系转换成到我提供的下面类中，以便让我支持序列化
    - 您不需要返回任何的回复，只返回json字符串防止序列化错误
    - 如果是多个请用[]包裹，然后你不要在外面多对象包括，我需要的结果是只返回 [{}] 这种效果。

    public class Info
    {
        /// <summary>
        /// 获取或设置名字。
        /// </summary>
        public string Name { get; set; }
    
        /// <summary>
        /// 获取或设置字号。
        /// </summary>
        public string Alias { get; set; }
    
        /// <summary>
        /// 获取或设置出生日期。
        /// </summary>
        public string BirthDate { get; set; }
    
        /// <summary>
        /// 获取或设置出生地。
        /// </summary>
        public string BirthPlace { get; set; }
    
        /// <summary>
        /// 获取或设置职业。
        /// </summary>
        public string Occupation { get; set; }
    
        /// <summary>
        /// 获取或设置主要成就。
        /// </summary>
        public string MainAchievement { get; set; }
    
        /// <summary>
        /// 获取或设置逝世日期。
        /// </summary>
        public string DeathDate { get; set; }
    }
    ";

var kernelArguments = new KernelArguments()
{
    ["input"] = info,
};

var json = await kernel.InvokePromptAsync(promptTemplate, kernelArguments);

var values = JsonSerializer.Deserialize<Info[]>(json.ToString());

foreach (var value in values)
{
    Console.WriteLine($"Name: {value.Name}");
    Console.WriteLine($"Alias: {value.Alias}");
    Console.WriteLine($"BirthDate: {value.BirthDate}");
    Console.WriteLine($"BirthPlace: {value.BirthPlace}");
    Console.WriteLine($"Occupation: {value.Occupation}");
    Console.WriteLine($"MainAchievement: {value.MainAchievement}");
    Console.WriteLine($"DeathDate: {value.DeathDate}");
    Console.WriteLine();
}